namespace ItemHelperLib.Define
{
    // Item可获取属性枚举 - 包含所有有公共 getter 的属性
    // 这些属性可以直接通过 item.PropertyName 访问
    public enum ItemGettableProperty
    {
        // 基础属性 (有 getter)
        TypeID,                    // get (internal set)
        Order,                     // get/set
        DisplayName,               // get only (返回本地化文本)
        DisplayNameRaw,            // get/set (原始键值)
        Description,               // get only (返回本地化文本)
        DescriptionRaw,            // get only (原始键值)
        Icon,                      // get/set
        
        // 堆叠相关
        MaxStackCount,             // get/set
        Stackable,                 // get only (计算属性: MaxStackCount > 1)
        StackCount,                // get/set (通过 Variables 存储)
        
        // 价值和品质
        Value,                     // get/set
        Quality,                   // get/set
        DisplayQuality,            // get/set
        
        // 重量相关
        UnitSelfWeight,            // get only (单个物品重量)
        SelfWeight,                // get only (考虑堆叠的重量)
        TotalWeight,               // get only (包含子物品的总重量)
        
        // 标签和状态
        Sticky,                    // get only (Tags.Contains("Sticky"))
        CanBeSold,                 // get only (!Sticky && !Tags.Contains("NotSellable"))
        CanDrop,                   // get only (!Sticky)
        Tags,                      // get only (返回 TagCollection)
        
        // 代理和图形
        HasHandHeldAgent,          // get only
        AgentUtilities,            // get only
        ActiveAgent,               // get only
        ItemGraphic,               // get only
        
        // 统计和修饰符
        Stats,                     // get only
        Modifiers,                 // get only
        Slots,                     // get only
        
        // 库存和效果
        Inventory,                 // get (internal set)
        Effects,                   // get only (返回 List<Effect>)
        
        // 使用相关
        UsageUtilities,            // get only
        UseTime,                   // get only
        
        // 父子关系
        PluggedIntoSlot,           // get only
        InInventory,               // get only
        ParentItem,                // get only (计算属性)
        ParentObject,              // get only (计算属性)
        
        // 变量和常量
        Variables,                 // get only (返回 CustomDataCollection)
        Constants,                 // get only (返回 CustomDataCollection)
        
        // 角色相关
        IsCharacter,               // get only (Tags.Any(e => e.name == "Character"))
        
        // 耐久度相关
        UseDurability,             // get only (MaxDurability > 0)
        MaxDurability,             // get/set (通过 Constants 存储)
        MaxDurabilityWithLoss,     // get only (计算属性)
        DurabilityLoss,            // get/set (通过 Variables 存储)
        Durability,                // get/set (通过 Variables 存储)
        
        // 检查状态
        Inspected,                 // get/set (通过 Variables 存储)
        Inspecting,                // get/set
        NeedInspection,            // get only (计算属性)
        
        // 其他状态
        IsBeingDestroyed,          // get only
        Repairable,                // get only (UseDurability && Tags.Contains("Repairable"))
        SoundKey,                  // get only
    }
    
    // Item可设置属性枚举 - 包含所有有公共 setter 的属性
    // 这些属性可以直接通过 item.PropertyName = value 设置
    public enum ItemSettableProperty
    {
        // 基础属性 (有 public setter)
        Order,                     // get/set
        DisplayNameRaw,            // get/set
        Icon,                      // get/set
        
        // 堆叠相关
        MaxStackCount,             // get/set
        StackCount,                // get/set (会触发事件和验证)
        
        // 价值和品质
        Value,                     // get/set
        Quality,                   // get/set
        DisplayQuality,            // get/set
        
        // 耐久度相关
        MaxDurability,             // get/set (通过 Constants)
        DurabilityLoss,            // get/set (通过 Variables)
        Durability,                // get/set (通过 Variables，会触发事件)
        
        // 检查状态
        Inspected,                 // get/set (通过 Variables，会递归设置子物品)
        Inspecting,                // get/set (会触发事件)
    }
    
    // Item私有字段枚举 - 包含所有私有/受保护的字段
    // 这些字段只能通过反射访问，格式: item.GetType().GetField("fieldName", BindingFlags.NonPublic | BindingFlags.Instance)
    // 注意：如果私有字段有对应的公共属性可以设置，则已注释掉，应使用公共属性而不是反射
    public enum ItemPrivateField
    {
        // 基础私有字段
        typeID,                    // int - 物品类型ID (有 internal setter，但没有公共 setter)
        // order,                  // int - 排序值 (有公共属性 Order 可设置)
        // displayName,            // string - 显示名称原始值 (有公共属性 DisplayNameRaw 可设置)
        // icon,                   // Sprite - 图标 (有公共属性 Icon 可设置)
        // maxStackCount,          // int - 最大堆叠数量 (有公共属性 MaxStackCount 可设置)
        // value,                  // int - 价值 (有公共属性 Value 可设置)
        // quality,                // int - 品质 (有公共属性 Quality 可设置)
        // displayQuality,         // DisplayQuality - 显示品质 (有公共属性 DisplayQuality 可设置)
        weight,                    // float - 单位重量 (只读，通过 UnitSelfWeight 获取)
        
        // 缓存字段 (内部使用，不应直接修改)
        _cachedWeight,             // float - 缓存的重量
        _cachedTotalWeight,        // float? - 缓存的总重量
        handheldHash,              // int - "Handheld" 的哈希值
        
        // 集合字段 (只读，通过公共属性访问)
        tags,                      // TagCollection - 标签集合 (通过 Tags 属性访问)
        agentUtilities,            // ItemAgentUtilities - 代理工具 (通过 AgentUtilities 属性访问)
        itemGraphic,               // ItemGraphicInfo - 图形信息 (通过 ItemGraphic 属性访问)
        stats,                     // StatCollection - 统计集合 (通过 Stats 属性访问)
        slots,                     // SlotCollection - 插槽集合 (通过 Slots 属性访问)
        modifiers,                 // ModifierDescriptionCollection - 修饰符集合 (通过 Modifiers 属性访问)
        variables,                 // CustomDataCollection - 变量集合 (通过 Variables 属性访问)
        constants,                 // CustomDataCollection - 常量集合 (通过 Constants 属性访问)
        // inventory,              // Inventory - 库存 (有公共属性 Inventory，虽然是 internal set)
        effects,                   // List<Effect> - 效果列表 (通过 Effects 属性访问)
        usageUtilities,            // UsageUtilities - 使用工具 (通过 UsageUtilities 属性访问)
        
        // 关系字段 (只读，通过公共属性访问)
        pluggedIntoSlot,           // Slot - 插入的插槽 (通过 PluggedIntoSlot 属性访问)
        inInventory,               // Inventory - 所在的库存 (通过 InInventory 属性访问)
        
        // 状态字段
        initialized,               // bool - 是否已初始化 (内部状态，不应直接修改)
        // _inspecting,            // bool - 是否正在检查 (有公共属性 Inspecting 可设置)
        soundKey,                  // string - 声音键 (通过 SoundKey 属性访问，但只读)
        isBeingDestroyed,          // bool - 是否正在被销毁 (通过 IsBeingDestroyed 属性访问，但只读)
    }
}